/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package fait.ferm.persists;

import fait.ferm.global.Glob;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Класс, описывающий сущность "Ферма". Расширяет класс {@link fait.ferm.persists.PersistsObject PersistsObject}
 * @author zx
 */
public final class Ferm extends PersistsObject
{
	/**
	 * Пользователь, владелец фермы
	 */
	public int game_id;
	/**
	 * Название фермы
	 */
	public String name="";
	/**
	 * Количество денег на расчетном счете
	 */
	public double pc;
	//private String table = "ferm";
	
	/**
	 * Создается  пустой объект, которого нет в БД
	 * @param con Соединение с БД
	 */
	public Ferm(){
		super();
		table = "ferm";
		game_id=-1;
		pc = 0.0; //new BigDecimal(0.0);
	}
	/**Создается объект из БД по id. Данные загружаются из БД
	 * @param pc Соединение с БД
	 * @param pid id фермы
	 * @throws Exception
	 */
	public Ferm( int pid) throws Exception {
		super(pid);
		table = "ferm";
		load();
	}
	

	/**
	 * Загружает параметры фермы из БД, если id > 0
	 * @throws Exception
	 */
	@Override
	public void load() throws Exception {
		boolean notSuccessfully=true;
		if(id==-1) {
			throw new Exception("Ферма не загружена");
		}	
		try (Statement st = con.createStatement()) {
			String q = "SELECT game_id, name, pc FROM "+table+" WHERE id = " + id;
			ResultSet rs = st.executeQuery(q);
			if(rs.next()){
				notSuccessfully=false;
				game_id = rs.getInt("game_id");
				name = rs.getString("name");
				pc = rs.getDouble("pc");
			}
			rs.close();
		}
		if(notSuccessfully) {
			throw new Exception("Ферма не загружена");
		}	
	}

	/**
	 * Обновляет параметры фермы в БД
	 * @throws SQLException
	 */
	@Override
	protected void update() throws SQLException {
		try (Statement st = con.createStatement()) {
			String q = "UPDATE "+table+" SET name='"+name+"', pc="+pc+", game_id = "+ game_id + " " +
					"WHERE id="+id;
			st.executeUpdate(q);
		}

	}

	/**
	 * Создает новую запись в БД с параметрами объекта. 
	 * При этом генерируется новый id фермы
	 * @throws SQLException
	 */
	@Override
	protected void createNew() throws SQLException {
		try (Statement st = con.createStatement()) {
			String q = "INSERT INTO "+table+" ( game_id, name, pc) VALUES("+game_id + ",'"+name+"',"+pc+") ";
			st.executeUpdate(q);
			q="SELECT seq FROM sqlite_sequence WHERE name = '"+table+"'";
			ResultSet rs = st.executeQuery(q);
			if(rs.next()){
				id = rs.getInt("seq");
			}
			rs.close();
		}
	
	}
	@Override
	public String toString(){
		return name;
	}	
	
	/**
	 * Статический метод, который возвращает строковое описание объекта, без загрузки всех его параметров
	 * @param id - идентификатор объекта
	 * @return Возвращает строку-описание объекта, если такой объект есть в БД или пустую строку в противном случае.
	 */
	public static String getName(int id){
		Connection con = Glob.getConnection();
		ResultSet rs = null;
		boolean notSuccessfully=true;
		String name = "";
		if(id==-1) {
			return "";
		}	
		try (Statement st = con.createStatement()) {
			String q = "SELECT name FROM ferm WHERE id = " + id;
			rs = st.executeQuery(q);
			if(rs.next()){
				notSuccessfully=false;
				name = rs.getString("name");
			}
		}
		catch (SQLException ex) {
			Logger.getLogger(Ferm.class.getName()).log(Level.SEVERE, null, ex);
		}finally{
			try {			
				rs.close();
			} catch (SQLException ex) {
				Logger.getLogger(Ferm.class.getName()).log(Level.SEVERE, null, ex);
			}
		}		
		return name;
	}
}
